每天的專案會同步到 GitLab 上,可以前往 GitLab 查看。
有興趣的朋友歡迎留言 or 來信討論,我的信箱是 nickchen1998@gmail.com。
Embedding 是一種將複雜數據轉換為低維度向量的技術,這種技術常用於自然語言處理(NLP)、推薦系統、圖像辨識等等各種常見的領域。
Embedding 的目的是將高維度或稀疏的數據表示(例如文字、圖片、用戶行為等)映射到一個低維度的向量空間中,使得具有相似特徵的數據在這個空間中距離較近。
換句話說,Embedding 是一種將物體(例如單詞、句子、圖片等)表示為一組固定大小的數字向量的方式,而這些向量通常包含了物體之間的某些關聯資訊。
在自然語言處理中,單字通常是以詞嵌入的形式表示。假設我們有三個單詞:“貓”、“狗”和“蘋果”。這些單字在文字型態下是無法直接進行數學運算的。
但我們可以將這些單詞轉換為向量,比如:
“貓” → [0.1, 0.3, 0.7]
“狗” → [0.2, 0.4, 0.8]
“蘋果” → [0.9, 0.1, 0.1]
這些向量之間的距離可以表示單詞之間的相似度,例如“貓”和“狗”是動物,向量的距離較近,而“蘋果”是一種水果,與前兩個詞距離較遠。
上面我們簡單介紹了一下 Embedding 的概念,接下來我們來看一下該麼透過 OpenAI 的 API 來取得 Embedding:
import requests
from env_settings import EnvSettings
env_settings = EnvSettings()
embedding_url = "https://api.openai.com/v1/embeddings"
headers = {
"Authorization": f"Bearer {env_settings.OPENAI_API_KEY}",
"Content-Type": "application/json"
}
statement = "I am happy"
response = requests.post(
embedding_url,
headers=headers,
json={
"input": statement,
"model": "text-embedding-ada-002",
"encoding_format": "float"
}
)
print(response.json())
在上面的程式碼當中,我們試著直接使用 requests 請求 OpenAI 的 API 來取得 Embedding,
下圖中可以看到執行這段程式碼後,我們可以取得 I am happy
這句話的 Embedding:
而在 LangChain 當中,同樣也幫我們封裝好各大語言模型的 Embedding 方法,讓我們可以直接使用,讓我們看一下下面的範例:
from env_settings import EnvSettings
from langchain_openai.embeddings import OpenAIEmbeddings
env_settings = EnvSettings()
embedding = OpenAIEmbeddings(
openai_api_key=env_settings.OPENAI_API_KEY
)
print(embedding.embed_query("I am happy"))
可以看到,透過 LangChain 替我們封裝好的方法,可以讓我們的程式碼更加簡潔,並且可以直接取得 Embedding 的結果。
我們可以把這次產生出的 embedding 的結果跟上一張圖片對比,可以發現,同樣的一段句子產生出來的向量會是一樣的,表示語意完全一樣。
接著我們要把句子算出來的 embedding 存進向量資料庫,這次鐵人賽我們選擇 Pinecone 作為我們的向量資料庫,原因是他有提供免費的線上方案,
可以省去我們在本地部屬的時間,且使用上的難易度較低,LangChain 本身也有寫好的方法可以用,降低我們的開發成本,下面我們就帶大家來快速了解一下如何進行操作:
於 Pinecone 中 index 的概念類似於 SQL 中的一個 database。
註冊 Pinecone 帳號:前往官網點選註冊,填寫基本資料即可。點我前往
進到主控台後,選擇 Create Index
。
輸入基本資訊,並選擇服務提供商。
點選利用模型選擇維度,並選擇 OpenAI
。
跳轉回建立完成的頁面,可以看到我們成功建立一組 index。
接著我們就要來透過 LangChain 協助我們插入文本的向量到 Pinecone 的資料庫中,讓我們看一下下面的範例:
pip install pinecone
pip install langchain-pinecone
請記得安裝上面兩個套件
from env_settings import EnvSettings
from langchain_openai.embeddings import OpenAIEmbeddings
from langchain_pinecone import PineconeVectorStore
from langchain_core.documents import Document
from pinecone import Pinecone
env_settings = EnvSettings()
embedding = OpenAIEmbeddings(
openai_api_key=env_settings.OPENAI_API_KEY
)
vector_store = PineconeVectorStore(
index=Pinecone(api_key=env_settings.PINECONE_API_KEY).Index("ithelp"),
embedding=embedding
)
document = Document(page_content="I am happy.")
result = vector_store.add_documents([document])
print(result)
透過上面的程式碼,我們可以將 I am happy.
這句話的 Embedding 存進 Pinecone 的資料庫中,讓我們可以透過這個向量來進行搜尋,
至於透過 print
印出來後的結果,則是存進向量資料庫後,每個 document 所回傳 id,類似於資料庫的 primary key。
最後我們回到 Pinecone 的主控台,可以看到我們剛剛存進去的向量資料:
這樣我們就成功地把我們的文本轉換成向量,並且存進向量資料庫了!
今天我們介紹了 embedding 以及用來存放 embedding 的向量資料庫,明天我們要來介紹一下 RAG 這個觀念。